package com.colorlight.cloud.gateway.api.message.process;


import com.colorlight.cloud.gateway.api.message.constraint.protocol.ProtocolType;
import com.colorlight.cloud.gateway.api.message.model.Msg;
import com.colorlight.cloud.gateway.api.message.constraint.schedule.ScheduleActions;

/**
 * @author john.lyle
 * @date 2024/1/11 10:17
 * @description Mqtt上报信息处理公共接口
 * 业务相关的接口
 */
public interface ProcessMessageEventHandler<K extends ScheduleActions> {
	/**
	 * 协议类型层面的区分
	 *
	 * @return 协议名 默认为null 不区分协议类型
	 * @author Demon
	 **/
	/**
	 * 协议层面的区分
	 *
	 * @return 协议名
	 * @author Demon
	 **/
	String getProtocolType();
	
	/**
	 * map由 协议类型于
	 *
	 * @return map 的key
	 * @author Demon
	 **/
	default String mapKey() {
		ProtocolType instructionType = (ProtocolType) getInstructionType();
		String mapKey = getProtocolType() + instructionType.getThisName();
		return mapKey.toLowerCase();
	}
	
	/**
	 * 获取该接口实现对应的指令枚举
	 *
	 * @return 指令枚举
	 */
	Enum<? extends ProtocolType> getInstructionType();
	
	/**
	 * 指令处理
	 *
	 * @param deviceName 设备名称
	 * @param msg        指令实体信息
	 */
	void accept(String deviceName, Msg<K> msg);
	
	
	/**
	 * 指令处理
	 *
	 * @param deviceName   设备名称
	 * @param msg          指令实体信息
	 * @param protocolType 协议类型
	 */
	void accept(String deviceName, String protocolType, Msg<K> msg);
}
